#ifndef QQMUSIC_H
#define QQMUSIC_H

#include <QWidget>
#include <QMouseEvent>
#include <QDebug>
#include <QGraphicsDropShadowEffect>
#include <QJsonObject>
#include <QJsonArray>
#include "volumetool.h"
#include <QFileDialog>
#include <QDir>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QPropertyAnimation>
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlQuery>
#include <QSystemTrayIcon>  //添加系统托盘
#include <QMenu>

#include "musiclist.h"
#include "commonpage.h"

#include "lrcpage.h"

QT_BEGIN_NAMESPACE
namespace Ui { class QQMusic; }
QT_END_NAMESPACE

class QQMusic : public QWidget
{
    Q_OBJECT

public:
    QQMusic(QWidget *parent = nullptr);
    ~QQMusic();

    void initUi(); //初始化ui界面

    //为了实现移动整个窗口的目的
    void mouseMoveEvent(QMouseEvent* event);
    void mousePressEvent(QMouseEvent *event);


    void connectSignalsAndSlots();

    QJsonArray randomPiction();  //该函数是用来设置推荐页面recboxitem的图片和文本的，函数的作用是返回图片路径 和 文本对应的键值对总和
private slots:
    void on_quit_clicked();

    void onBtFormClick(int pageid);
    void on_volume_clicked();

    void on_addLocal_clicked(); //添加本地音乐

    void onUpdateLikeMusicAndPage(bool isLike, const QString& musicId); //更新是否是喜欢的音乐，并更新localpage, likepage, historypage页面

    //播放控制区的槽函数, 歌曲在播放和暂停之间切换
    void onPlayMusic();

    void initPlayer();

    void onPlayerStateChanged();  //QMediaPlayer中 stateChanged()对应的槽函数

    void onPlayUpClicked(); //上一曲

    void onPlayDownClicked(); //下一曲

    void onPlaybackModeClicked();//播放模式发生改变的时候的槽函数

    void onCurrentIndexChanged(int index);  //playlist中的播放源发生了改变，index表示正在播放的媒体索引

    void onPlayAll(PageType pagetype); //当CommonPage中的播放所有的按钮点击之后，给QQMusic发送的信号
    void playAllMusicOfCommonPage(CommonPage* page, int index); //点击CommonPage中的播放所有触发的槽函数
    void playMusicByIndex(CommonPage* page, int index);


    //VolumeTool类中的
    void setPlayerMuted(bool isMuted);


    void setPlayerVolume(int volume);

    void onDurationChanged(qint64 duration); //媒体源切换，播放时间会发生改变
    void onPositionChanged(qint64 postion); //播放进度发生改变
    void onMusicSliderChanged(float ration); //进度条改变需要修改

    void onMetaDataAvailableChanged(bool available); //媒体源元数据发生改变的时候

    void onLrcWordClicked();

    void initSqlite();

    void initMusicList(); //程序启动的时候初始化musicList

    void on_skin_clicked();

    void on_min_clicked();

    void on_max_clicked();

    void updateBtformAnimal();


    void onQQmusicQuit();

private:
    Ui::QQMusic *ui;

    bool isDrag;
    QPoint dragPosition; //负责移动整个窗口的类

    VolumeTool* volumeTool;  //界面上的音量调节的类

    MusicList musicList;  //歌曲列表，用来组织歌曲文件的类

    QMediaPlayer* player;  //媒体播放类，要借助下面的playList播放多首音乐

    QMediaPlaylist* playList; //播放集合，播放模式的设置

    CommonPage* currentPage; //记录当前正在播放的CommonPage页面

    qint64 totalTime; //记录媒体源的播放总时间

    int currentPlayMusicIndex; //当前播放音乐索引

    LrcPage* lrcPage;

    QPropertyAnimation* lrcPageAnimal;

    QSqlDatabase sqlite;
};
#endif // QQMUSIC_H



//实现窗口拖拽的功能
//1，鼠标左键按下，一直按下
//2，鼠标按下的同时，鼠标移动
//3，修改窗口左上角的位置
//鼠标在移动的过程中，鼠标和窗口左上角的相对位置是没有发生变化的
//鼠标点击以后，需要获取光标相对于屏幕左上角的全局坐标
//当鼠标点击的时候，获取到光标的全局坐标之后，减去窗口左上角的坐标，即光标相对于窗口左上角的距离
//在窗口移动的过程中，需要保证该距离不发生变化

/*
鼠标事件的实现方式：
1，过滤
2，重写父类的虚函数




*/













